package com.atguigu.gmall.all.controller;

import com.atguigu.gmall.common.result.Result;
import com.atguigu.gmall.list.client.ListFeignClient;
import com.atguigu.gmall.model.list.SearchParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Controller
public class ListController {
    @Autowired
    private ListFeignClient listFeignClient;

    //  控制器！
    //  http://list.gmall.com/list.html?category3Id=61
    //  http://list.gmall.com/list.html?keyword=小米手机
    //  http://list.gmall.com/list.html?keyword=小米手机&trademark=1:小米
    //  springmvc 对象传值！如果传递的参数与实体类的属性名一样，则可以使用实体类获取！ 自动映射！
    //  @RequestBody 不加！ 因为这个注解只获取json 数据！

    @GetMapping("list.html")
    public String list(SearchParam searchParam, Model model){

        //  searchParam propsParamList trademarkList urlParam attrsList orderMap goodsList pageNo totalPages
        //  SearchResponseVo = result.getData();  trademarkList attrsList goodsList pageNo totalPages
        //  通过对比：你会发现 实体类的属性名与后台要存储的key 有部分一样！
        //  获取销售属性值Id 与 skuId 组成的数据时 ， bean 与 map 可以替换！
        Result<Map> result = listFeignClient.list(searchParam);
        //  searchParam.keyword 第一种可能：认为是一个实体类调用属性 第二种可能：map.get();
        //        SearchResponseVo searchResponseVo = (com.atguigu.gmall.model.list.SearchResponseVo) result.getData();
        //        model.addAttribute("trademarkList",searchResponseVo.getTrademarkList());
        //        model.addAttribute("attrsList",searchResponseVo.getAttrsList());

        //  urlParam ： 记录用户原来的请求！

         String urlParam = this.makeUrlParam(searchParam);

        //  品牌面包屑：
        String trademarkParam =  this.makeTrademarkParam(searchParam.getTrademark());

        // order=2:asc
        Map<String,Object> orderMap = this.makeOrderMap(searchParam.getOrder());
        //  存储平台属性面包屑：
        List<Map<String,Object>> propsParamList = this.makePropsParamList(searchParam.getProps());
        model.addAttribute("urlParam",urlParam);
        model.addAllAttributes(result.getData());
        model.addAttribute("searchParam",searchParam);
        model.addAttribute("trademarkParam",trademarkParam);
        model.addAttribute("propsParamList",propsParamList);
        model.addAttribute("orderMap",orderMap);
        //  返回页面名称
        return "list/index";
    }

    /**
     * 封装获取平台属性面包屑！
     * @param props
     * @return
     */
    private List<Map<String, Object>> makePropsParamList(String[] props) {
        List<Map<String, Object>> list = new ArrayList<>();
        //  props=24:256G:机身内存&props=107:小米:二级手机&props=106:安卓手机:手机一级&
        if (props!=null && props.length>0){
            //  循环遍历：
            for (String prop : props) {
                //  分割：
                String[] split = prop.split(":");
                if (split!=null && split.length==3){
                    Map<String, Object> map = new HashMap<>();
                    map.put("attrId",split[0]);
                    map.put("attrValue",split[1]);
                    map.put("attrName",split[2]);
                    //  将集合添加到map
                    list.add(map);
                }
            }
        }

        return list;
    }

    /**
     * 设置排序
     * @param order
     * @return
     */
    private Map<String, Object> makeOrderMap(String order) {
        Map<String, Object> map = new HashMap<>();
        //  判断 order=2:asc
        if (!StringUtils.isEmpty(order)){
            //  分割：
            String[] split = order.split(":");
            if (split!=null && split.length==2){
                map.put("type",split[0]);
                map.put("sort",split[1]);
            }
        }else {
            map.put("type",1);
            map.put("sort","desc");
        }
        return map;
    }


    //  获取品牌面包屑
    private String makeTrademarkParam(String trademark) {
        // 判断：trademark =1：小米
        if (!StringUtils.isEmpty(trademark)){
            String[] split = trademark.split(":");
            if (split != null && split.length ==2){
                return "品牌:" + split[1];
            }
        }
        return "";
    }


    /**
     * 拼接用户查询的URL:
     * @param searchParam
     * @return
     */
    private String makeUrlParam(SearchParam searchParam) {
        StringBuilder sb = new StringBuilder();
        //  http://list.gmall.com/list.html?keyword=手机
        //  用户根据关键词检索！
        if (!StringUtils.isEmpty(searchParam.getKeyword())){
            sb.append("keyword=").append(searchParam.getKeyword());
        }
        //  用户根据分类检索！
        //  http://list.gmall.com/list.html?category3Id=61
        if (!StringUtils.isEmpty(searchParam.getCategory3Id())){
            sb.append("category3Id=").append(searchParam.getCategory3Id());
        }
        if (!StringUtils.isEmpty(searchParam.getCategory2Id())){
            sb.append("category2Id=").append(searchParam.getCategory2Id());
        }
        if (!StringUtils.isEmpty(searchParam.getCategory1Id())){
            sb.append("category1Id=").append(searchParam.getCategory1Id());
        }

        //  会根据品牌：
        //  http://list.gmall.com/list.html?category2Id=13&trademark=1:小米
        if (!StringUtils.isEmpty(searchParam.getTrademark())){
            if (sb.length()>0) {
                sb.append("&trademark=").append(searchParam.getTrademark());
            }
        }

        //  会根据平台属性检索！
        String[] props = searchParam.getProps();
        //  http://list.gmall.com/list.html?category2Id=13&trademark=1:小米&props=23:4G:运行内存&props=24:256G:机身内存
        if (props != null && props.length>0){
            // 循环
            for (String prop : props) {
                if (sb.length()>0){
                    sb.append("&props=").append(prop);
                }
            }
        }
        // 返回拼接后的url
        return "list.html?"+ sb.toString();
    }
}
